package com.zenithmind.mall.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 商品统计信息实体 - 遵循单一职责原则，专门管理统计数据
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mall_product_statistics")
public class ProductStatistics extends BaseEntity {

    /**
     * 商品ID
     */
    private String productId;

    /**
     * 销售数量
     */
    private Integer salesCount;

    /**
     * 浏览数量
     */
    private Integer viewCount;

    /**
     * 收藏数量
     */
    private Integer favoriteCount;

    /**
     * 评价数量
     */
    private Integer reviewCount;

    /**
     * 好评数量
     */
    private Integer positiveReviewCount;

    /**
     * 平均评分
     */
    private Double averageRating;

    /**
     * 是否推荐（0-否，1-是）
     */
    private Integer isRecommend;

    /**
     * 是否新品（0-否，1-是）
     */
    private Integer isNew;

    /**
     * 是否热销（0-否，1-是）
     */
    private Integer isHot;

    /**
     * 最后更新统计时间
     */
    private LocalDateTime lastStatisticsTime;

    // 业务方法

    /**
     * 增加浏览量
     */
    public void increaseViewCount() {
        this.viewCount = (this.viewCount != null ? this.viewCount : 0) + 1;
        updateLastStatisticsTime();
    }

    /**
     * 增加销售量
     */
    public void increaseSalesCount(Integer quantity) {
        if (quantity != null && quantity > 0) {
            this.salesCount = (this.salesCount != null ? this.salesCount : 0) + quantity;
            updateLastStatisticsTime();
        }
    }

    /**
     * 增加收藏量
     */
    public void increaseFavoriteCount() {
        this.favoriteCount = (this.favoriteCount != null ? this.favoriteCount : 0) + 1;
        updateLastStatisticsTime();
    }

    /**
     * 减少收藏量
     */
    public void decreaseFavoriteCount() {
        this.favoriteCount = Math.max(0, 
            (this.favoriteCount != null ? this.favoriteCount : 0) - 1);
        updateLastStatisticsTime();
    }

    /**
     * 增加评价
     */
    public void addReview(Integer rating) {
        if (rating != null && rating >= 1 && rating <= 5) {
            this.reviewCount = (this.reviewCount != null ? this.reviewCount : 0) + 1;
            
            // 更新好评数量（4星及以上算好评）
            if (rating >= 4) {
                this.positiveReviewCount = (this.positiveReviewCount != null ? this.positiveReviewCount : 0) + 1;
            }
            
            // 重新计算平均评分
            recalculateAverageRating(rating);
            updateLastStatisticsTime();
        }
    }

    /**
     * 删除评价
     */
    public void removeReview(Integer rating) {
        if (rating != null && rating >= 1 && rating <= 5 && 
            this.reviewCount != null && this.reviewCount > 0) {
            
            this.reviewCount = this.reviewCount - 1;
            
            // 更新好评数量
            if (rating >= 4 && this.positiveReviewCount != null && this.positiveReviewCount > 0) {
                this.positiveReviewCount = this.positiveReviewCount - 1;
            }
            
            updateLastStatisticsTime();
        }
    }

    /**
     * 计算好评率
     */
    public Double getPositiveReviewRate() {
        if (reviewCount == null || reviewCount == 0) {
            return 0.0;
        }
        int positive = positiveReviewCount != null ? positiveReviewCount : 0;
        return (double) positive / reviewCount;
    }

    /**
     * 检查是否为热销商品
     */
    public boolean isHotProduct() {
        return Objects.equals(this.isHot, 1);
    }

    /**
     * 检查是否为推荐商品
     */
    public boolean isRecommendProduct() {
        return Objects.equals(this.isRecommend, 1);
    }

    /**
     * 检查是否为新品
     */
    public boolean isNewProduct() {
        return Objects.equals(this.isNew, 1);
    }

    /**
     * 更新最后统计时间
     */
    private void updateLastStatisticsTime() {
        this.lastStatisticsTime = LocalDateTime.now();
    }

    /**
     * 重新计算平均评分（简化版本，实际应该从数据库重新计算）
     */
    private void recalculateAverageRating(Integer newRating) {
        if (this.averageRating == null) {
            this.averageRating = newRating.doubleValue();
        } else {
            int totalReviews = this.reviewCount != null ? this.reviewCount : 1;
            double totalScore = this.averageRating * (totalReviews - 1) + newRating;
            this.averageRating = totalScore / totalReviews;
        }
    }

    /**
     * 检查统计数据是否有效
     */
    public boolean isValid() {
        return productId != null && !productId.trim().isEmpty() &&
               (salesCount == null || salesCount >= 0) &&
               (viewCount == null || viewCount >= 0) &&
               (favoriteCount == null || favoriteCount >= 0) &&
               (reviewCount == null || reviewCount >= 0) &&
               (positiveReviewCount == null || positiveReviewCount >= 0) &&
               (averageRating == null || (averageRating >= 0 && averageRating <= 5));
    }
}
